package com.arpa.ntocc.common.common.util;

import cn.hutool.crypto.SecureUtil;
import com.arpa.ntocc.common.common.exception.ServiceException;
import cn.hutool.crypto.SecureUtil;
import com.arpa.ntocc.common.common.constant.StrConsts;
import com.arpa.ntocc.common.common.exception.ServiceException;
import lombok.extern.log4j.Log4j2;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.regex.Pattern;

/**
 * 校验工具类
 * @Author liuyj
 * @Date 2019-12-02 18:51:26
 */
@Log4j2
public class ValidateUtil {

    /**
     * 手机号校验 1开头的11位数字
     */
    private static final String PHONE_REGEX = "1[0-9]{10}";
    /**
     * 密码校验 数字字母组合 8位及以上
     */
    private static final String PD_REGEX = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z_]{8,20}$";

    private static String serviceErrorMsg = "job请求非法";

    /**
     * 校验手机号
     * 格式：1 开头，11位数字
     * @param phone
     * @return
     */
    public static boolean phone(String phone){
        boolean flag =false;
        try {
            flag = Pattern.matches(PHONE_REGEX,phone);
        } catch (Exception e) {
            log.error(StrConsts.CATCH_MESSAGE,e);
        }
        return flag;
    }

    /**
     * 校验密码
     * 格式：数字字母组合 8位及以上
     * @param passwd
     * @return
     */
    public static boolean passwd(String passwd){
        boolean flag =false;
        try {
            flag = Pattern.matches(PD_REGEX,passwd);
        } catch (Exception e) {
            log.error(StrConsts.CATCH_MESSAGE,e);
        }
        return flag;
    }


    /**
     * 校验xxl-job请求安全性
     * 校验规则：
     * 1，jobNow和当前服务器相差30分钟以外则认定非法
     * 2，jobNow和“arpa”拼接字符后进行md5加密，和jobValid不相等则认定非法
     * 3, 万能校验码 20202020arpa802!，直接方形
     * @param jobNow xxl-job推送的时间 格式 yyyy-MM-dd_HH:mm:ss
     * @param jobValid xxl-job校验码
     * @return
     */
    public static boolean xxlJobValid(String jobNow,String jobValid){
        if("2020arpa802!".equals(jobValid)){
            return true;
        }
        try {
            //当前服务器的前后30分钟
            LocalDateTime qian30 = LocalDateTime.now().minusMinutes(30);
            LocalDateTime hou30 = LocalDateTime.now().plusMinutes(30);
            LocalDateTime jobTime = LocalDateTime.parse(jobNow, DateTimeFormatter.ofPattern("yyyy-MM-dd_HH:mm:ss"));
            //1,jobNow和当前服务器相差30分钟以外则认定非法
            if(jobTime.isBefore(qian30) || jobTime.isAfter(hou30) ){
                throw new ServiceException(serviceErrorMsg);
            }
            //2,正确校验码
            String rightValid = SecureUtil.md5(jobNow+"arpa");
            if(!rightValid.equals(jobValid)){
                throw new ServiceException(serviceErrorMsg);
            }
        } catch (Exception e) {
            log.error("异常", e);
            throw new ServiceException(serviceErrorMsg);
        }
        return true;
    }
}
